數據庫安全通常是組織最關心的問題之一。開箱即用的 PostgreSQL 不提供足夠的保護措施來確保數據保護和隱私。因此,需要采取額外措施來確保數據隱私和安全。為與服務器建立的連接啟用 SSL 身份驗證是確保數據隱私的方法之一。PostgreSQL 支持與數據庫服務器建立的 SSL 連接,從而確保客戶端和服務器之間交換的所有通信都是加密的。
在本教程中,我們將演示如何為 PostgreSQL 數據庫服務器啟用 SSL 連接。
第 1 步:安裝 PostgreSQL 服務器
首先,您需要在 Linux 系統上安裝 PostgreSQL 服務器。如果您的服務器上已經安裝了 PostgreSQL,請隨時跳到下一步。
在本指南中,我們將從在 Rocky Linux 8 上安裝最新版本的 PostgreSQL (PostgreSQL 14) 開始。
首先,通過 SSH 登錄到您的服務器。接下來,刷新存儲庫并將包升級到最新版本。
sudo dnf update
AppStream 存儲庫未提供最新版本的 PostgreSQL。要驗證這一點,請列出可用的 PostgreSQL 模塊。
dnf module list postgresql -y
從上面的輸出來看,存儲庫提供的最新版本的 PostgreSQL 是 PostgreSQL 13.x。要安裝最新版本的 PostgreSQL,請將 PostgreSQL 存儲庫添加到您的系統。
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
接下來,禁用默認的 PostgreSQL 存儲庫:
sudo dnf module disable postgresql -qy
接下來,按如下方式安裝 PostgreSQL 14 Server 和客戶端。
sudo dnf install postgresql14 postgresql14-server -y
此后,按如下方式初始化 PostgreSQL 數據庫。
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
默認情況下,PostgreSQL 安裝在 Rocky Linux 上時不會自動啟動。因此,啟動數據庫服務。
$ sudo systemctl start postgresql-14
此外,使其在系統啟動時啟動。
$ sudo systemctl enable postgresql-14
要確認 PostgreSQL 服務正在運行,請執行以下命令:
$ sudo systemctl status postgresql-14
上面的輸出確認 PostgreSQL 服務器已啟動并正在運行。默認情況下,PostgreSQL 偵聽端口 5432,您可以通過運行以下ss
命令來確認這一點。
$ ss -pnltu | grep 5432
您應該得到以下輸出,確認一切正常。
第 2 步:為 Postgres 用戶配置密碼
postgres
安裝 PostgreSQL 時,會在系統中創建一個名為的默認用戶。這是一個超級用戶,擁有執行幾乎任何任務的訪問權限,包括管理數據庫、表、模式函數和 PostgreSQL 數據庫中的任何其他對象。
Postgres用戶使用ident認證方式,不設置密碼。出于安全原因,建議您設置密碼以防止潛在的違規行為。
為此,請切換到根用戶
$ sudo su
接下來,切換到postgres
用戶。
$ su - postgres
切換到 PostgreSQL shell
$ psql
然后使用如圖所示的查詢設置postgres
用戶密碼。ALTER
ALTER USER postgres WITH PASSWORD 'your-password'
第 3 步:為 PostgreSQL 服務器生成 SSL 證書
要使 SSL 與 PostgreSQL 一起工作,您需要生成三個證書文件:
- server.key - 這是私鑰文件
- server.crt - 這是服務器證書文件
- root.crt - 這是受信任的根證書
首先,將目錄更改為 PostgreSQL 的數據目錄,如圖所示。
cd /var/lib/pgsql/14/data
接下來,生成一個 2048 位的 AES 加密的 RSA 私鑰,如下所示。
openssl genrsa -aes128 2048 > server.key
在創建私鑰期間,系統會提示您輸入密碼。輸入并確認。
您稍后可以通過運行以下命令確認密鑰存在:
ls -l | grep server.key
私鑰有一個與之關聯的密碼。但是,為了進一步使用此密鑰,您需要刪除密碼。為此,請運行以下命令:
openssl rsa -in server.key -out server.key
再一次,重新輸入密碼并按 ENTER。
第 4 步:應用所需的權限和所有權
為了增強安全性,您需要將私鑰的只讀權限分配給 root 用戶,如圖所示。
chmod 400 server.key
此外,將密鑰的所有權設置為 postgres 用戶和組。
chown postgres.postgres server.key
第 5 步:創建服務器證書文件
現在,根據私鑰生成一個自簽名證書文件。以下證書文件的有效期為 365 天。
# openssl req -new -key server.key -days 365 -out server.crt -x509
該命令將要求您提供一些將合并到證書文件中的信息。因此,請相應地填寫所有詳細信息。
由于您使用的是自簽名證書,因此您將通過制作服務器證書文件的副本將其用作受信任的根證書,如圖所示。
# cp server.crt root.crt
第 6 步:配置 PostgreSQL 以使用 SSL
下一步是配置 PostgreSQL 以使用 SSL。訪問postgresql.conf
位于data?
目錄內的配置文件。
$ sudo vim /var/lib/pgsql/14/data/postgresql.conf
在 下Connection Settings
,找到listen_addresses
參數并將其設置為允許來自所有外部主機的連接。
listen_addresses = '*'
在該SSL
部分中,取消注釋以下參數并設置值,如下所示。
ssl = on
ssl_ca_file = 'root.crt'
ssl_cert_file = 'server.crt'
ssl_crl_file = ''
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
ssl_prefer_server_ciphers = on
保存更改并退出文件。接下來,打開pg_hba.conf
配置文件。這是 PostgreSQL 客戶端身份驗證配置文件,指定允許連接哪些主機以及如何對客戶端進行身份驗證。
$ sudo vim /var/lib/pgsql/14/data/pg_hba.conf
在 下IPv4 local connections
,按如下方式修改該行以允許來自所有主機的連接。
host all all 0.0.0.0/0 md5
接下來,在文件末尾添加以下行以啟用 SSL 并允許來自所有主機的連接。
hostssl all all 0.0.0.0/0 md5
保存更改并退出配置文件。要使更改生效,請重新啟動 PostgreSQL。
$ sudo systemctl restart postgresql-14
如果啟用了 firewalld,請允許 Postgresql 服務,如圖所示
$ sudo firewall-cmd --add-service=postgresql --permanent
$ sudo firewall-cmd --reload
步驟 7:測試 SSL 連接
此時,PostgreSQL 已配置為使用 SSL 進行遠程連接。為此,我們將使用用戶 postgres 登錄到數據庫服務器,如圖所示
psql -U postgres -p 5432 -h 45.79.192.104
該-U
標志表示我們用來訪問數據庫服務器的登錄用戶
該-p
標志指定 PostgreSQL 正在偵聽的端口(默認為 5432)
該-h
標志指定主機的 IP 地址。
下面的輸出確認 SSL 已啟用并且我們使用的是自簽名證書。
結論
在本教程中,我們演示了如何使用自簽名 SSL 證書在 PostgreSQL Server 上啟用 SSL 支持。我們為 PostgreSQL 服務器上配置的所有數據庫和用戶啟用了 SSL 連接。服務器將偵聽默認 PostgreSQL 端口上的所有傳入連接,并要求客戶端使用 SSL。